home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / Mesa / src-glut / glutAttachDetachMenu.c < prev    next >
C/C++ Source or Header  |  1998-08-02  |  4KB  |  207 lines

  1. /*
  2.  * Amiga GLUT graphics library toolkit
  3.  * Version:  1.1
  4.  * Copyright (C) 1998 Jarno van der Linden
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Library General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2 of the License, or (at your option) any later version.
  10.  *
  11.  * This library is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Library General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Library General Public
  17.  * License along with this library; if not, write to the Free
  18.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21.  
  22. /*
  23.  * glutAttachDetachMenu.c
  24.  *
  25.  * Version 1.0  27 Jun 1998
  26.  * by Jarno van der Linden
  27.  * jarno@kcbbs.gen.nz
  28.  *
  29.  */
  30.  
  31.  
  32. #include <proto/gadtools.h>
  33. #include <proto/intuition.h>
  34.  
  35. #include <stdlib.h>
  36.  
  37. #include "glutstuff.h"
  38.  
  39.  
  40. struct Menu *GetMenuPointer(int button)
  41. {
  42.     struct Menu *menu;
  43.  
  44.     menu = glutstuff.curwin->menu;
  45.  
  46.     switch(button)
  47.     {
  48.         case GLUT_RIGHT_BUTTON:
  49.             menu = menu->NextMenu;
  50.         case GLUT_MIDDLE_BUTTON:
  51.             menu = menu->NextMenu;
  52.         case GLUT_LEFT_BUTTON:
  53.             break;
  54.     }
  55.  
  56.     return(menu);
  57. }
  58.  
  59.  
  60. int CountMenuEntries(struct GlutMenu *gm)
  61. {
  62.     struct GlutMenuEntry *gme;
  63.     int n;
  64.  
  65.     n = 1;    /* This menu item */
  66.  
  67.     gme = gm->entries;
  68.  
  69.     while(gme)
  70.     {
  71.         if(gme->issubmenu)
  72.             n += CountMenuEntries(stuffGetMenu(gme->value))+2;    /* Will include (sub)menu item */
  73.         else
  74.             n++;    /* Just this menu entry */
  75.  
  76.         gme = gme->next;
  77.     }
  78.  
  79.     return(n);
  80. }
  81.  
  82.  
  83. void FillEntry(struct NewMenu **nm,UBYTE nm_type, STRPTR nm_Label, APTR nm_UserData)
  84. {
  85.     (*nm)->nm_Type = nm_type;
  86.     (*nm)->nm_Label = nm_Label;
  87.     (*nm)->nm_CommKey = 0;
  88.     (*nm)->nm_Flags = 0;
  89.     (*nm)->nm_MutualExclude = 0;
  90.     (*nm)->nm_UserData = nm_UserData;
  91.     (*nm)++;
  92. }
  93.  
  94.  
  95. void FillMenu(struct GlutMenu *gm, struct NewMenu **nm,UBYTE type)
  96. {
  97.     struct GlutMenuEntry *gme;
  98.  
  99.     gme = gm->entries;
  100.     while(gme)
  101.     {
  102.         FillEntry(nm, type, gme->name, gme);
  103.         if(gme->issubmenu)
  104.         {
  105.             if(type == NM_SUB)
  106.             {
  107.                 ((*nm)-1)->nm_Flags = NM_ITEMDISABLED;
  108.                 FillEntry(nm, type, NM_BARLABEL, 0);
  109.             }
  110.             FillMenu(stuffGetMenu(gme->value),nm,NM_SUB);
  111.             if(type == NM_SUB)
  112.                 FillEntry(nm, type, NM_BARLABEL, 0);
  113.         }
  114.         gme = gme->next;
  115.     }
  116. }
  117.  
  118.  
  119. struct MenuItem *MakeMenu(struct GlutMenu *gm)
  120. {
  121.     struct NewMenu *nm,*nmp;
  122.     int n;
  123.     struct MenuItem *menu;
  124.  
  125.     n = CountMenuEntries(gm);
  126.     menu = NULL;
  127.  
  128.     nm = calloc(n+1, sizeof(struct NewMenu));
  129.     if(nm)
  130.     {
  131.         nmp = nm;
  132.  
  133.         FillMenu(gm,&nmp,NM_ITEM);
  134.         FillEntry(&nmp, NM_END, NULL, 0);
  135.  
  136.         menu = (struct MenuItem *)CreateMenus(nm, TAG_END);
  137.  
  138.         free(nm);
  139.     }
  140.  
  141.     return(menu);
  142. }
  143.  
  144.  
  145. void RedoMenu(int button, struct GlutMenu *glutmenu)
  146. {
  147.     struct Menu *menu;
  148.     struct MenuItem *menuitems;
  149.  
  150.     menu = GetMenuPointer(button);
  151.     ClearMenuStrip(glutstuff.curwin->window);
  152.     FreeMenus(menu->FirstItem);
  153.     if(glutmenu)
  154.     {
  155.         menuitems = MakeMenu(glutmenu);
  156.         menu->FirstItem = menuitems;
  157.         LayoutMenuItems(menuitems,glutstuff.curwin->vi,
  158.                 GTMN_Menu,        menu,
  159.                 TAG_END);
  160.     }
  161.     else
  162.     {
  163.         menu->FirstItem = NULL;
  164.     }
  165.     SetMenuStrip(glutstuff.curwin->window,glutstuff.curwin->menu);
  166. }
  167.  
  168.  
  169. void glutAttachMenu( int button)
  170. {
  171.     switch(button)
  172.     {
  173.         case GLUT_LEFT_BUTTON:
  174.             glutstuff.curwin->leftmenu = glutstuff.curmenu;
  175.             glutstuff.curwin->needleftmenu = TRUE;
  176.             break;
  177.         case GLUT_MIDDLE_BUTTON:
  178.             glutstuff.curwin->middlemenu = glutstuff.curmenu;
  179.             glutstuff.curwin->needmiddlemenu = TRUE;
  180.             break;
  181.         case GLUT_RIGHT_BUTTON:
  182.             glutstuff.curwin->rightmenu = glutstuff.curmenu;
  183.             glutstuff.curwin->needrightmenu = TRUE;
  184.             break;
  185.     }
  186. }
  187.  
  188.  
  189. void glutDetachMenu( int button)
  190. {
  191.     switch(button)
  192.     {
  193.         case GLUT_LEFT_BUTTON:
  194.             glutstuff.curwin->leftmenu = NULL;
  195.             glutstuff.curwin->needleftmenu = TRUE;
  196.             break;
  197.         case GLUT_MIDDLE_BUTTON:
  198.             glutstuff.curwin->middlemenu = NULL;
  199.             glutstuff.curwin->needmiddlemenu = TRUE;
  200.             break;
  201.         case GLUT_RIGHT_BUTTON:
  202.             glutstuff.curwin->rightmenu = NULL;
  203.             glutstuff.curwin->needrightmenu = TRUE;
  204.             break;
  205.     }
  206. }
  207.